package com.linkgie.galaxyframework.metadata;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.core.annotation.AliasFor;

/**
 * 数据字段；
 * <p>
 * 
 * 适用于 {@link DataEntity} 和 {@link DataInterface} 标注的类型中；
 * 
 * @author huanghaiquan
 *
 */
@Target({ ElementType.FIELD, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataField {

	public static final int MAX_ORDER = Integer.MAX_VALUE;

	/**
	 * 字段的标题名；
	 * 
	 * @return
	 */
	String value() default "";

	/**
	 * 字段的标题名；
	 * 
	 * @return
	 */
	@AliasFor("value")
	String name() default "";

	/**
	 * 是否为只读字段；
	 * <p>
	 * 
	 * 默认为 false ；
	 * <p>
	 * 
	 * 当设置为 false 时，表示字段非只读，但并不表示实际可写，需要取决于声明的字段定义了实际可写的方法；
	 * <p>
	 * 
	 * “只读”字段的语义是指“在任何编辑态在都不可修改，包括创建新对象时。”
	 * <p>
	 * 
	 * 注：如果标注的字段没有声明 set 方法，则字段总是维持只读状态，而忽略此属性的设置；
	 * 
	 * @return
	 */
	boolean readonly() default false;

	/**
	 * 是否为可修改字段；
	 * <p>
	 * 
	 * 默认为 true ；
	 * <p>
	 * 
	 * 当设置为 false 时，表示字段的值在已有对象的编辑状态不可修改，但在新增对象的编辑状态下是可写的。
	 * <p>
	 * 与只读 {@link #readonly()} 的区别是，“只读”字段的语义是指“在任何编辑态在都不可修改，包括创建新对象时。”
	 * <p>
	 * 
	 * 注：如果标注的字段没有声明 set 方法，则字段总是维持只读状态，而忽略此属性的设置；
	 * 
	 * 
	 * @return
	 */
	boolean modifiable() default true;

	/**
	 * 隐藏字段；
	 * 
	 * @return
	 */
	boolean hide() default false;

	/**
	 * 提示信息；
	 * 
	 * @return
	 */
	String hint() default "";

	/**
	 * 当字段为可迭代类型时，支持的对字段的数据列表的操作；
	 * 
	 * <p>
	 * 默认支持增加(Add)、修改(Update)、删除(Delete)操作；
	 * 
	 * @return
	 */
	IteratorOperation[] iterates() default { IteratorOperation.ADD, IteratorOperation.UPDATE,
			IteratorOperation.DELETE };

	/**
	 * 字段顺序；
	 * 
	 * @return
	 */
	int order() default MAX_ORDER;

}
